package com.vic.classloader.class_load_time;
/*

1 类的生命周期
包括以下 7 个阶段：
● 加载（Loading）
● 验证（Verification）
● 准备（Preparation）
● 解析（Resolution）
● 初始化（Initialization）
● 使用（Using）
● 卸载（Unloading）
其中，前五个阶段是最重要的，它们也是类加载过程，可以通过一句谐音来记忆“家宴准备了西式菜” = 家 (加载) 宴 (验证) 准备 (准备) 了西 (解析) 式 (初始化) 菜。

2 类加载时机
对应类的生命周期加载阶段，加载是类加载的第一个阶段，这里的类加载时机是加载阶段的内容。

1）主动引用（见active_ref包）
    1.1 当遇到 new、getstatic、putstatic 或 invokestatic 这 4 条字节码指令时。
    1.2 使用 java.lang.reflect包的方法对类进行反射调用时如 Class.forname(“…”), 或newInstance() 等等。如果类没初始化，需要触发类的加载。
    1.3 子类被加载时，父类也会被加载。
    1.4 当一个接口中定义了 JDK8 新加入的默认方法（被 default 关键字修饰的接口方法）时，如果有这个接口的实现类发生了加载，则该接口要在实现类之前被加载。
    1.5 main方法执行时，main方法所在的类也会被加载。
2）被动引用（见passivae_ref包）
    除"主动引用"之外，所有引用类的方式都不会触发加载，称为被动引用。
    2.1 通过子类引用父类的静态字段，不会导致子类加载。
    2.2 通过数组定义来引用类，不会触发此类的加载。该过程会对数组类进行加载，数组类是一个由虚拟机自动生成的、直接继承自 Object 的子类，其中包含了数组的属性和方法。
    2.3 常量在编译阶段会存入调用类的常量池中，本质上并没有直接引用到定义常量的类，因此不会触发定义常量的类的加载。
 */


